#include "mycharts.h"
#include <QDebug>


/**
 * @brief : 构造函数，初始化成员属性m_chartView视图，当前对象设为m_chartView视图的父对象，
 *          并设置视图抗锯齿，为m_chart添加x,y轴，并设置图例为右对齐，图例样式为线条
 * @param parent : 父对象指针
 * @return : None
 */
MyCharts::MyCharts(QWidget *parent)
    : QWidget{parent}
{
    m_chartView.setChart(&m_chart);
    m_chartView.setParent(this);
    m_chartView.setRenderHint(QPainter::Antialiasing);
    m_axisX.setLinePen(QPen(3));
    m_axisY.setLinePen(QPen(3));
    m_chart.addAxis(&m_axisX, Qt::AlignBottom);
    m_chart.addAxis(&m_axisY, Qt::AlignLeft);
    p_legend = m_chart.legend();
    p_legend->setMarkerShape(QLegend::MarkerShapeFromSeries);
    p_legend->setAlignment(Qt::AlignRight);
}


/**
 * @brief : 根据参数重置视窗大小
 * @param w : 视窗宽度
 * @param h : 视窗高度
 * @return : None
 */
void MyCharts::resize(const int& w, const int& h)
{
    m_chartView.resize(w, h);
    // m_chartView.viewport()->resize(w, h);
}


/**
 * @brief : 根据参数设置坐标轴范围
 * @param min : 坐标轴最小值
 * @param max : 坐标轴最大值
 * @param formatString : 坐标值显示格式字符串
 * @param tickCount : 坐标轴刻度线数量
 * @param orietation : 设置的坐标轴朝向，Horizontal(0):表示横轴X, Vertical(1):表示纵轴Y
 * @return : None
 */
void MyCharts::setAxisRange(const qreal& min, const qreal& max, const QString& formatString, const int& tickCount, const ENUM_ORIENTATION& orietation)
{
    switch(orietation){
    case ENUM_ORIENTATION::Horizontal:
        m_axisX.setLabelFormat(formatString);
        m_axisX.setRange(min, max);
        m_axisX.setTickCount(tickCount);
        break;

    case ENUM_ORIENTATION::Vertical:
        m_axisY.setLabelFormat(formatString);
        m_axisY.setRange(min, max);
        m_axisY.setTickCount(tickCount);
        break;

    default:
        break;
    }

}


/**
 * @brief : 根据参数设置坐标刻度线
 * @param pen : 绘制刻度线的笔刷
 * @param orietation : 设置的坐标轴朝向，Horizontal(0):表示横轴X, Vertical(1):表示纵轴Y
 * @return : None
 */
void MyCharts::setAxisGridLine(const QPen& pen, const ENUM_ORIENTATION& orietation)
{
    switch(orietation){
    case ENUM_ORIENTATION::Horizontal:
        m_axisX.setGridLinePen(pen);
        break;

    case ENUM_ORIENTATION::Vertical:
        m_axisY.setGridLinePen(pen);
        break;

    default:
        break;
    }
}


/**
 * @brief : 根据参数设置坐标刻度值
 * @param color : 刻度值文本字体颜色
 * @param font : 刻度值文本的字体
 * @param orietation : 设置的坐标轴朝向，Horizontal(0):表示横轴X, Vertical(1):表示纵轴Y
 * @return : None
 */
void MyCharts::setAxisLabel(const QColor& color, const QFont& font, const ENUM_ORIENTATION& orietation)
{
    switch(orietation){
    case ENUM_ORIENTATION::Horizontal:
        m_axisX.setLabelsColor(color);
        m_axisX.setLabelsFont(font);
        break;

    case ENUM_ORIENTATION::Vertical:
        m_axisY.setLabelsColor(color);
        m_axisY.setLabelsFont(font);
        break;

    default:
        break;
    }
}


/**
 * @brief : 根据参数设置坐标轴标题，以及其字体和颜色
 * @param name : 坐标轴显示的文本名称
 * @param font : 坐标轴显示文本时使用的字体(字体，大小等)
 * @param color : 坐标轴显示文本时的颜色
 * @param orietation : 设置的坐标轴朝向，Horizontal(0):表示横轴X, Vertical(1):表示纵轴Y
 * @return : None
 */
void MyCharts::setAxisTitleName(const QString& name, const QFont& font, const QColor& color, const ENUM_ORIENTATION& orietation)
{
    switch(orietation){
    case ENUM_ORIENTATION::Horizontal:
        m_axisX.setTitleBrush(QBrush(color));
        m_axisX.setTitleFont(font);
        m_axisX.setTitleText(name);
        break;

    case ENUM_ORIENTATION::Vertical:
        m_axisY.setTitleBrush(QBrush(color));
        m_axisY.setTitleFont(font);
        m_axisY.setTitleText(name);
        break;

    default:
        break;
    }
}


/**
 * @brief : 根据参数绘制曲线
 * @param name : 曲线的名称
 * @param data : 曲线的坐标点数据
 * @param pen : 绘制该条曲线的笔刷配置
 * @return : None
 */
void MyCharts::drawCurve(const QString& name, QList<std::shared_ptr<QPointF>> data, const QPen& pen)
{
    QLineSeries* ls = new QLineSeries;
    ls->setName(name);

    ls->setPen(pen);

    // qDebug()<< name << ":" << data.size();

    // 遍历数据点
    for(auto const& point : std::as_const(data)){
        ls->append(*point);
    }
    m_chart.addSeries(ls);
    ls->attachAxis(&m_axisX);
    ls->attachAxis(&m_axisY);
}


/**
 * @brief : 根据参数设置曲线图标题
 * @param name : 曲线图标题
 * @param font : 曲线图标题使用的字体(字体，大小等)
 * @param color : 曲线图标题文本的颜色
 * @return : None
 */
void MyCharts::setChartTitle(const QString& name, const QFont& font, const QColor& color)
{
    m_chart.setTitleBrush(QBrush(color));
    m_chart.setTitleFont(font);
    m_chart.setTitle(name);
}


/**
 * @brief : 将曲线图保存为图片文件
 * @param filePath : 图片文件路径
 * @return : None
 */
void MyCharts::saveToPicture(const QString& filePath)
{
    QPixmap p = m_chartView.grab();
    p.save(filePath);
}
